作者:陈广 日期:2019-3-28
通过本实验,掌握 ISO15693 电子标签的单张卡片选卡以及多卡片选卡操作。
ISO15693 协议卡的读取距离更长,同时读取多张卡片的性能比 ISO14443 更为强大。我们先从单次读取一张标签开始。
在我手上这台读写器上,ISO15693 标签的选取与 ISO14443 标签的选取有所不同。ISO14443 标签需要先请求,然后再防冲突,之后才能选中一张标签。ISO15693 使用的是询查(Inventory)虽然也要经过防冲突流程,询查已经整合的防冲突,不再需要单独调用防冲突流程即可返回单张或多张标签,并且可以通过标签的 AFI 过滤掉与请求 AFI 不符的标签。并且,每返回一张标签,就会将此标签置于静默状态,从而下次再询查时不会重复选中该标签。从而使得选择 ISO15693 标签相比之前在 ISO14443 标签请求实验中所做的内容大为简化。
首先,新建一个 WPF 应用程序,界面代码如下:
<Window x:Class="I15693FormDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:I15693FormDemo"
mc:Ignorable="d"
Title="ISO15693 选卡操作" Height="366.207" Width="272.414" Loaded="Window_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Grid.Row="0" Content="选取一张标签" Margin="10,10,10.2,9.6" Grid.ColumnSpan="3" Click="Button_Click"/>
<ListBox x:Name="lstCard" Grid.Row="1" Margin="10,0.4,10.2,10" Grid.ColumnSpan="3"/>
</Grid>
</Window>
程序代码如下:
using HBLib;
using HBLib.HR8002Reader;
using HBLib.ISO15693;
using System;
using System.Threading.Tasks;
using System.Windows;
namespace I15693FormDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
ComPort com = new ComPort("COM3", 19200, 300);
Reader reader;
I15693 i15693;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
com.Open();
reader = new Reader(0x00, com);
i15693 = new I15693(0x00, com);
reader.ChangeToISO15693Async();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Inventory();
}
private async Task Inventory()
{
var info =await i15693.InventoryWithoutAFIAsync();
this.Dispatcher.Invoke(new Action(() =>
{
lstCard.Items.Add(info.GetUIDStr());
}));
}
}
}
运行程序,多次单击按钮进行选卡操作,最终结果如下图所示:
我一共放了 6 张标签,要在不动标签的情况下读完 6 张标签几乎是不可能完成的任务。如果 6 张标签完全重叠放置,则一张标签都无法读出。从结果可知,我点了 13 次按钮,才读完 6 张标签,期间还得不信地移动标签。在询查完一张标签后,标签应该已处于静默状态,不会再被询查到,但最终还是有可能重复读取一张标签。可知此读写器选卡性能并不优异,当然,一分钱一分货,这个没什么好说的。结果中的全 0 表示没有选到任何标签。
思考题(难度 **):编写程序,循环进行询查操作直到读完 6 张标签后结束,标签的 UID 不会重复显示,询查期间可以移动标签。另外请注意,如果使用的是模拟器,就不要做这个思考题了,我并没有模拟这样的效果。
HR8002 读写器还有扫描(InventoryScan)功能,它可以一次返回感应场内的多张标签。还可以选择继续扫描功能,从而不会返回重复标签。
将程序代码更改如下:
using HBLib;
using HBLib.HR8002Reader;
using HBLib.ISO15693;
using System;
using System.Threading.Tasks;
using System.Windows;
namespace I15693FormDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
ComPort com = new ComPort("COM3", 19200, 300);
Reader reader;
I15693 i15693;
bool isFirst = true;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
com.Open();
reader = new Reader(0x00, com);
i15693 = new I15693(0x00, com);
reader.ChangeToISO15693Async();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
InventoryScan();
}
private async Task InventoryScan()
{
InventoryScanInfo info;
if (isFirst)
{ //新的扫描
info = await i15693.InventoryScanWithoutAFIAsync(InventoryScanWithoutAFIMode.NewScanWithoutAFI);
isFirst = false;
}
else
{ //继续扫描
info = await i15693.InventoryScanWithoutAFIAsync(InventoryScanWithoutAFIMode.ContinueScanWithoutAFI);
}
this.Dispatcher.Invoke(new Action(() =>
{
foreach (var card in info.CardSet)
{
lstCard.Items.Add(card.GetUIDStr());
}
}));
}
}
}
运行程序,这一次扫完所有标签就轻松多了,基本不会扫出重复的标签。当然,还是需要移动标签的位置方能扫完所有标签。
;